/*
 * Jenny Ruppen 09-730-391
 * Sebastien Goldberg 08-914-855
 * Henry Raymond 08-928-061
 * Stefan Mussato 09-752-270
 */
 
package ch.uzh.ifi.sopra.gruppe9.game;

import java.rmi.RemoteException;
import java.util.ArrayList;


public interface IGameBoard {

	boolean isInGame() throws RemoteException;

	int registerPlayer() throws RemoteException;
	
	void registerUpdateSubscriber(String name, String ip) throws RemoteException;
	
	void startGame() throws RemoteException;
	
	void startGame(ArrayList<IPlayer> players) throws RemoteException;

	int getPlayerNum() throws RemoteException;
	
	IPlayer getPlayer(int index) throws RemoteException;
	
	int getTurn();
	
	void setProtege(int index);

	int getProtege();

	int getSeason();

	ArrayList<IPlayer> endOfGame(ArrayList<IPlayer> players) throws RemoteException;

	void nextPlayersTurn(int lastPlayerActionLocation, int lastPlayerActionDetail) throws RemoteException;
	
	void nextPlayersTurn(ArrayList<IPlayer> players) throws RemoteException;
	
	boolean cheat(int playerIndex, int type) throws RemoteException;
	
	void reportUpdatePlayerList();
	
	void reportStartGame();
	
	void reportNewSeason();
	
	void reportUpdateMoneyBuyingAgentsInventory();
	
	void reportUpdateBank();
	
	void reportUpdateConstructionAuthority();
	
	void reportUpdateTowerElementMarket();
	
	void reportUpdateHouseOfSpies();
	
	void reportUpdatePalaceOfTheCaliph();
	
	void reportNextPlayerTurn(int nextPlayerIndex, int lastPlayerIndex, int lastPlayerActionLocation, int lastPlayerActionDetail);
	
	void reportEndOfSeason();
	
	void reportEndOfGame();

	TowerElementMarket getBaseElementMarket() throws RemoteException;

	TowerElementMarket getMiddleElementMarket() throws RemoteException;
	
	TowerElementMarket getWindowElementMarket() throws RemoteException;

	TowerElementMarket getRoofElementMarket() throws RemoteException;
	
	ConstructionAuthority getConstructionAuthority() throws RemoteException;
	
	PalaceOfTheCaliph getPalaceOfTheCaliph() throws RemoteException;
	
	Bank getBank() throws RemoteException;
	
	HouseOfSpies getHouseOfSpies() throws RemoteException;
	
}
